﻿using System;
using System.Collections.Generic;
using System.Data;

using Joel.ImpresionesJL.Modelo.Entidades;
using Joel.ImpresionesJL.AccesoDatos;

namespace Joel.ImpresionesJL.Repositorios
{
    public class RepositorioCliente : RepositorioBase<Cliente>
    {
        #region Constructores

        public RepositorioCliente()
        { }

        #endregion

        #region Propiedades

        private RepositorioTelefono RepositorioTelefono
        { get { return new RepositorioTelefono(); } }

        private ServicioDatosCliente ServicioDatosCliente
        { get { return new ServicioDatosCliente(); } }

        #endregion

        #region Metodos

        protected override Cliente FilaAEntidad(DataRow fila)
        {
            Cliente entidad = new Cliente();
            entidad.Id = Convert.ToInt32(fila["IdCliente"]);
            entidad.Nombre = Convert.ToString(fila["NombreFantasia"]);
            entidad.RazonSocial = Convert.ToString(fila["RazonSocial"]);
            entidad.CuilCuit = Convert.ToString(fila["CuilCuit"]);
            entidad.Domicilio1 = Convert.ToString(fila["Domicilio1"]);
            entidad.Domicilio2 = Convert.ToString(fila["Domicilio2"]);
            entidad.Email1 = Convert.ToString(fila["Email1"]);
            entidad.Email2 = Convert.ToString(fila["Email2"]);
            entidad.Telefonos = RepositorioTelefono.ClientesTelefonos_DevolverPorIdCliente(entidad.Id);
            entidad.Comentarios = Convert.ToString(fila["Comentarios"]);
            entidad.EstaEliminado = Convert.ToBoolean(fila["EstaEliminado"]);
            return entidad;
        }

        public List<Cliente> Clientes_DevolverTodosHabilitados()
        {
            var clientes = new List<Cliente>();
            var ds = ServicioDatosCliente.Clientes_DevolverTodosHabilitados();
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                foreach (DataRow fila in ds.Tables[0].Rows)
                    clientes.Add(FilaAEntidad(fila));
            return clientes;
        }

        public List<Cliente> Clientes_DevolverTodosEliminados()
        {
            var clientes = new List<Cliente>();
            var ds = ServicioDatosCliente.Clientes_DevolverTodosEliminados();
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                foreach (DataRow fila in ds.Tables[0].Rows)
                    clientes.Add(FilaAEntidad(fila));
            return clientes;
        }

        public Cliente Clientes_DevolverPorId(Int32 idCliente)
        {
            var cliente = new Cliente();
            var ds = ServicioDatosCliente.Clientes_DevolverPorId(idCliente);
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                cliente = FilaAEntidad(ds.Tables[0].Rows[0]);
            return cliente;
        }

        public Int32 Clientes_Insertar(String nombreFantasia, String razonSocial, String cuilCuit, String domicilio1,
            String domicilio2, String email1, String email2, String comentarios)
        {
            return ServicioDatosCliente.Clientes_Insertar(nombreFantasia, razonSocial, cuilCuit, domicilio1, domicilio2, email1, email2, comentarios);
        }

        public void Clientes_Modificar(Int32 idCliente, String nombreFantasia, String razonSocial, String cuilCuit,
            String domicilio1, String domicilio2, String email1, String email2, String comentarios)
        {
            ServicioDatosCliente.Clientes_Modificar(idCliente, nombreFantasia, razonSocial, cuilCuit, domicilio1, domicilio2, email1, email2, comentarios);
        }

        public void Clientes_Habilitar(Int32 idCliente)
        {
            ServicioDatosCliente.Clientes_Habilitar(idCliente);
        }

        public void Clientes_Eliminar(Int32 idCliente)
        {
            ServicioDatosCliente.Clientes_Eliminar(idCliente);
        }

        public List<CuentaCorrienteRegistro> Clientes_ArmarCuentaCorriente(Int32 idCliente)
        {
            var cuentaCorriente = new List<CuentaCorrienteRegistro>();
            var ds = ServicioDatosCliente.Clientes_ArmarCuentaCorriente(idCliente);
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                foreach (DataRow fila in ds.Tables[0].Rows)
                {
                    var registro = new CuentaCorrienteRegistro();
                    registro.Fecha = Convert.ToDateTime(fila["Fecha"]);
                    registro.Concepto = Convert.ToString(fila["Concepto"]);
                    registro.Entrada = Convert.ToInt32(fila["Entrada"]);
                    registro.Salida = Convert.ToInt32(fila["Salida"]);
                    registro.Saldo = Convert.ToInt32(fila["Balance"]);
                    cuentaCorriente.Add(registro);
                }
            return cuentaCorriente;
        }

        #endregion
    }
}
